package br.usp.ime.ingpos.web.controllers;

import org.springframework.util.StringUtils;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Validations;
import br.usp.ime.ingpos.modelo.DadosPessoais;
import br.usp.ime.ingpos.modelo.Endereco;
import br.usp.ime.ingpos.modelo.TipoCedulaDeIdentidade;
import br.usp.ime.ingpos.modelo.TipoEstadoBrasil;
import br.usp.ime.ingpos.modelo.TipoEstadoCivil;
import br.usp.ime.ingpos.modelo.TipoPais;
import br.usp.ime.ingpos.modelo.TipoPerfil;
import br.usp.ime.ingpos.services.UsuarioService;
import br.usp.ime.ingpos.web.interceptors.RestrictAccessPerfil;
import br.usp.ime.ingpos.web.interceptors.Transactional;

@Resource
@RestrictAccessPerfil( values = {
    TipoPerfil.SECRETARIA, TipoPerfil.COORDENADOR, TipoPerfil.PROFESSOR
} )
public class CadastroController
{
    private static final String DADOS_PESSOAIS = "dadosPessoais";

    private static final String TIPOS_ESTADO_CIVIL = "tiposEstadoCivil";
    private static final String TIPOS_CEDULA_IDENTIDADE = "tiposCedulaIdentidade";
    private static final String TIPOS_PAIS = "tiposPais";
    private static final String TIPOS_ESTADOS_BRASIL = "tiposEstadosBrasil";

    private final UsuarioSessao usuarioSessao;
    private final Result result;
    private final UsuarioService usuarioService;
    private final Validator validador;
    private DadosPessoais dadosPessoais;

    public CadastroController(
        final Result result,
        final Validator validator,
        final UsuarioSessao usuarioSessao,
        final UsuarioService usuarioService )
    {
        this.result = result;
        this.validador = validator;
        this.usuarioSessao = usuarioSessao;
        this.usuarioService = usuarioService;
    }

    private void configurarResultDadosPessoais()
    {
        if( this.dadosPessoais == null )
            result.include( DADOS_PESSOAIS, usuarioSessao.getUsuario().getDadosPessoais() );
        else {
            result.include( DADOS_PESSOAIS, this.dadosPessoais );
        }
        result.include( TIPOS_ESTADO_CIVIL, TipoEstadoCivil.getTiposEstadoCivil() );
        result.include( TIPOS_CEDULA_IDENTIDADE, TipoCedulaDeIdentidade.getTiposCedulaIdentidade() );
        result.include( TIPOS_PAIS, TipoPais.getTiposPais() );
        result.include( TIPOS_ESTADOS_BRASIL, TipoEstadoBrasil.getTiposEstadosBrasil() );
    }

    @Get
    @Path( "/cadastro/dadosPessoais" )
    public void dadosPessoais()
    {
        configurarResultDadosPessoais();
    }

    @Post
    @Path( "/cadastro/dadosPessoais" )
    @Transactional
    public void dadosPessoais(
        final DadosPessoais dadosPessoais )
    {
        validador.checking( new Validations() {
            {
                if( dadosPessoais != null ) {

                    Endereco enderecoPermanente = dadosPessoais.getEnderecoPermanente();

                    that( StringUtils.hasText( dadosPessoais.getNomeCompleto() ), "erro_tipo_nome",
                        "erro_campo_nulo" );

                    that( dadosPessoais.getDataDeNascimento() != null, "erro_tipo_data_nascimento",
                        "erro_campo_nulo" );

                    that( StringUtils.hasText( dadosPessoais.getCedulaDeIdentidade().getNumero() ),
                        "erro_tipo_identidade", "erro_campo_nulo" );

                    that( StringUtils.hasText( enderecoPermanente.getLogradouro() ),
                        "erro_tipo_logradouro_permanente", "erro_campo_nulo" );

                    that( StringUtils.hasText( enderecoPermanente.getNumero() ),
                        "erro_tipo_numero_permanente", "erro_campo_nulo" );

                    that( StringUtils.hasText( enderecoPermanente.getCidade() ),
                        "erro_tipo_cidade_permanente", "erro_campo_nulo" );

                    that( StringUtils.hasText( enderecoPermanente.getTelefone().getCodTelefone() ),
                        "erro_tipo_telefone", "erro_campo_nulo" );

                    // Verifica se o endere�o � do brasil
                    if( ! enderecoPermanente.getPais().equals( TipoPais.BRASIL ) ) {
                        that( StringUtils.hasText( enderecoPermanente.getEstado() ),
                            "erro_tipo_estado_permanente", "erro_campo_nulo" );
                    } else {
                        that( StringUtils.hasText( enderecoPermanente.getCep().getCep() ),
                            "erro_tipo_cep_permanente", "erro_campo_nulo" );
                    }

                    // Nacionalidade dos dados pessoais
                    if( dadosPessoais.getNacionalidade().equals( TipoPais.BRASIL ) ) {

                        if( ! StringUtils.hasText( dadosPessoais.getCpf() ) ) {
                            that( false, "erro_tipo_cpf", "erro_campo_nulo" );
                        } else {
                            that( DadosPessoais.isValidoCpf( dadosPessoais.getCpf() ),
                                "erro_tipo_cpf", "erro_cpf_invalido" );
                        }
                    }

                    if( dadosPessoais.getCedulaDeIdentidade().getTipo().equals(
                        TipoCedulaDeIdentidade.OUTRO ) ) {
                        that(
                            StringUtils.hasText( dadosPessoais.getCedulaDeIdentidade().getOutro() ),
                            "cadastro_dados_pessoais_documento_outro", "erro_campo_nulo" );
                    }

                }

            }
        } );

        this.dadosPessoais = dadosPessoais; // mantem os dados já preenchidos
        validador.onErrorForwardTo( getClass() ).dadosPessoais();
        this.dadosPessoais = null;

        if( dadosPessoais.getNacionalidade().equals( TipoPais.BRASIL ) ) {
            String cpfSomenteNumeros = dadosPessoais.getCpf().replaceAll( "\\.", "" );
            cpfSomenteNumeros = cpfSomenteNumeros.replaceAll( "-", "" );
            dadosPessoais.setCpf( cpfSomenteNumeros );

            String cepSomenteNumeros = dadosPessoais.getEnderecoPermanente().getCep().getCep();
            cepSomenteNumeros = cepSomenteNumeros.replaceAll( "-", "" );
            dadosPessoais.getEnderecoPermanente().getCep().setCep( cepSomenteNumeros );

            cepSomenteNumeros = dadosPessoais.getEnderecoCorrespondencia().getCep().getCep();
            cepSomenteNumeros = cepSomenteNumeros.replaceAll( "-", "" );
            dadosPessoais.getEnderecoCorrespondencia().getCep().setCep( cepSomenteNumeros );
        }

        usuarioService.cadastrarDadosPessoais( usuarioSessao.getUsuario(), dadosPessoais );
        result.include( "messages", "cadastro_dados_pessoais_sucesso" );
        result.forwardTo( IndexController.class ).index();
    }

}
